package com.ftg.learn;

/**
 * 用来完成变长数组:
 * 线性结构： 数组 ： 表示为一组有序的（索引）的物理（数组）上连续的元素
 * 线性结构 ：另外一种 规范标准
 *
 * @author
 * @date 2024/2/28
 */
public class MyArray<X> implements List<X> {

    /**
     * 默认数组
     */
    private X[] data;

    /**
     * 现在有元素个数
     */
    private int size;

    /**
     * 数组默认大小
     */
    private final int DEFAULT_CAPACITY = 10;

    public MyArray() {

    }

    public MyArray(int capacity) {
        //容错处理
        if (0 > capacity) {
            throw new RuntimeException("数组初始容量要大于0");
        }
        this.data = (X[])new Object[capacity];
    }

    private void exArray(){
        if (data == null) {
            data = (X[])new Object[DEFAULT_CAPACITY];
        }
        //长度 3 == 3 满了
        if (this.size == data.length) {
            //扩容机制
            X[] dataNew = (X[])new Object[data.length + (data.length >> 1)];

            //循环
            System.arraycopy(data, 0, dataNew, 0, this.size);
            this.data = dataNew;
        }
    }

    /**
     * 添加元素
     *
     * @param val 整数
     */
    @Override
    public void add(Object val) {
        //容错的问题 0
        this.exArray();

        //存储内容
        this.data[this.size++] = (X)val;
    }



    /**
     * 获取元素
     *
     * @param index 下标
     * @return int
     */
    public X get(int index) {
        checkIndexOutBound(index);
        return this.data[index];
    }

    /**
     * 获取变长数组长度
     *
     * @return int
     */
    public int size() {
        return this.size;
    }

    private void checkIndexOutBound(int index) {
        if (index < 0 || index > this.size - 1) {
            throw new RuntimeException("下标越界");
        }
    }

    /**
     * 删除元素
     *
     * @param index 下标
     */
    public void remove(int index) {
        checkIndexOutBound(index);
        //向前移位
        System.arraycopy(data, index + 1, data, index, this.size - index - 1);
        this.size--;
    }

    public static void main(String[] args) {
        //面向接口编程（）
        List<Integer> myArray = new MyArray<>();
        myArray.add(1);
        myArray.add(2);
        myArray.add(3);
        myArray.add(4);


        myArray.remove(1);

        for (int i = 0; i < myArray.size(); i++) {
            System.out.println(myArray.get(i));
        }
    }


}
